package com.ruoyi.system.dto;

import com.ruoyi.system.entity.ContractFile;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 合同数据传输对象
 * 用于合同信息的展示、传输和处理（包含完整合同信息，含主键ID）
 */
@Data
public class ContractDTO {
    /**
     * 合同唯一标识（主键ID）
     * 对应数据库自增主键，用于唯一标识一条合同记录
     */
    private Long id;

    /**
     * 项目ID
     * 关联的项目唯一标识
     */
    private Long projectId;

    /**
     * 项目名称
     */
    private String projectName;

    /**
     * 合同类型
     * 枚举值：1-施工合同，2-整装合同，3-主材合同，4-软装合同
     * 修正为Integer类型，与数据库及实体类保持一致
     */
    private Integer contractType;

    /**
     * 合同名称
     * 标识合同的具体名称
     */
    private String contractName;

    /**
     * 纸质合同编号
     * 唯一标识，与实体纸质合同一一对应，具有唯一性约束
     */
    private String paperContractNo;

    /**
     * 签订人姓名
     * 签订该合同的人员姓名
     */
    private String signer;

    /**
     * 签订日期
     * 合同签订的日期，格式：YYYY-MM-DD
     */
    private LocalDate signDate;

    /**
     * 合同总金额（未优惠前）
     * 优惠前的原始总金额，精度为12位数字（含2位小数）
     */
    private BigDecimal totalAmount;

    /**
     * 优惠金额
     * 合同的优惠金额，例如1000.00表示优惠1000元，默认0.00，精度为12位数字（含2位小数）
     */
    private BigDecimal discountAmount;

    /**
     * 折扣率
     * 以小数形式表示的折扣，例如0.95表示95折，默认1.00（无折扣），精度为5位数字（含2位小数）
     */
    private BigDecimal discountRate;

    /**
     * 合同签订金额（最终实际金额）
     * 优惠后最终的实际签订金额，精度为12位数字（含2位小数）
     */
    private BigDecimal signedAmount;

    /**
     * 变更金额
     * 合同金额变更差值，正数表示增加，负数表示减少，默认0.00，精度12位数字（含2位小数）
     */
    private BigDecimal changeAmount;

    /**
     * 变更后总金额
     * 金额变更后的最终合同金额，精度12位数字（含2位小数）
     */
    private BigDecimal changedTotalAmount;

    /**
     * 已收款
     * 累计已收取的合同金额，默认0.00，精度12位数字（含2位小数）
     */
    private BigDecimal receivedAmount;

    /**
     * 未收金额
     * 剩余未收取的合同金额，默认0.00，精度12位数字（含2位小数）
     */
    private BigDecimal unreceivedAmount;

    /**
     * 预期工期
     * 合同约定的预计施工天数，单位：天
     */
    private Integer expectedDuration;

    /**
     * 周末是否施工
     * 枚举值：1-是（周末不施工），2-否（周末施工）
     * 修正为Integer类型，与数据库及实体类保持一致
     */
    private Integer noWeekendWork;

    /**
     * 节假日是否施工
     * 枚举值：1-是（节假日不施工），2-否（节假日施工）
     * 修正为Integer类型，与数据库及实体类保持一致
     */
    private Integer noHolidayWork;

    /**
     * 预计开工日期
     * 合同约定的预计开工日期，格式：YYYY-MM-DD
     */
    private LocalDate expectedStartDate;

    /**
     * 预计完工日期
     * 合同约定的预计完工日期，格式：YYYY-MM-DD
     */
    private LocalDate expectedEndDate;

    /**
     * 特殊条款
     * 合同中的特殊约定或补充协议内容，长文本格式
     */
    private String specialTerms;

    /**
     * 合同备注
     * 用于记录合同相关的其他说明信息
     */
    private String remarks;

    /**
     * 审核状态
     * 枚举值：0-待审核，1-审核中，2-审核通过，3-审核驳回
     * 补充审核状态，用于展示合同流程状态
     */
    private Integer auditStatus;

    /**
     * 创建时间
     * 补充创建时间，用于展示合同创建记录
     */
    private LocalDateTime createTime;

    /**
     * 更新时间
     * 补充更新时间，用于展示合同最新修改记录
     */
    private LocalDateTime updateTime;

    /**
     * 合同相关文件列表
     */
    private List<ContractFile> contractFiles;

    /**
     * 合同付款周期列表
     */
    private List<ContractPaymentScheduleDTO> paymentSchedules;

    /**
     * 客户id
     */
    private Long customerId;
}